﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.Xml;
namespace securityCrypto
{
    class Program
    {
        TripleDESCryptoServiceProvider tripleDES;
        string key_string;
        MD5CryptoServiceProvider md5provider;
        byte[] key;
        UTF8Encoding UTF8;
        public Program()
        {
            tripleDES = new TripleDESCryptoServiceProvider();
            md5provider = new MD5CryptoServiceProvider();
            UTF8 = new UTF8Encoding();
            key_string = "TripDES";
            key = md5provider.ComputeHash(UTF8.GetBytes(key_string));
            tripleDES.Key = key;
            tripleDES.Mode = CipherMode.ECB;
            tripleDES.Padding = PaddingMode.PKCS7;

        }
        public string encrypt(string text)
        {
            tripleDES.Key = key;
            tripleDES.Mode = CipherMode.ECB;
            tripleDES.Padding = PaddingMode.PKCS7;
            byte[] dataEncrypt = UTF8.GetBytes(text);
            byte[] result;
            try
            {
                ICryptoTransform crypto = tripleDES.CreateEncryptor();
                result = crypto.TransformFinalBlock(dataEncrypt, 0, dataEncrypt.Length);
            }
            finally
            {
                tripleDES.Clear();
                md5provider.Clear();
            }
            return Convert.ToBase64String(result);


        }
        public string decrypt(string text)
        {
            tripleDES.Key = key;
            tripleDES.Mode = CipherMode.ECB;
            tripleDES.Padding = PaddingMode.PKCS7;
            byte[] dataDecrypt = Convert.FromBase64String(text);
            byte[] result;

            try
            {
                ICryptoTransform crypto = tripleDES.CreateDecryptor();
                result = crypto.TransformFinalBlock(dataDecrypt, 0, dataDecrypt.Length);

            }
            finally
            {
                tripleDES.Clear();
                md5provider.Clear();
            }
            return UTF8.GetString(result);

        }
        static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
            try
            {
                //Create a new instance of RSACryptoServiceProvider.
                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

                //Import the RSA Key information. This only needs
                //toinclude the public key information.
                RSA.ImportParameters(RSAKeyInfo);

                //Encrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  
                return RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            //Catch and display a CryptographicException  
            //to the console.
            catch (CryptographicException e)
            {
                Console.WriteLine(e.Message);

                return null;
            }

        }

        static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
        {
            try
            {
                //Create a new instance of RSACryptoServiceProvider.
                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

                //Import the RSA Key information. This needs
                //to include the private key information.
                RSA.ImportParameters(RSAKeyInfo);

                //Decrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  
                return RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
            }
            //Catch and display a CryptographicException  
            //to the console.
            catch (CryptographicException e)
            {
                Console.WriteLine(e.ToString());

                return null;
            }

        }
        public void abc()
        {
            //Create a UnicodeEncoder to convert between byte array and string.
            UnicodeEncoding ByteConverter = new UnicodeEncoding();

            //Create byte arrays to hold original, encrypted, and decrypted data.
            byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
            byte[] encryptedData;
            byte[] decryptedData;

            //Create a new instance of RSACryptoServiceProvider to generate
            //public and private key data.
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

            //Pass the data to ENCRYPT, the public key information 
            //(using RSACryptoServiceProvider.ExportParameters(false),
            //and a boolean flag specifying no OAEP padding.
            encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);

            //Pass the data to DECRYPT, the private key information 
            //(using RSACryptoServiceProvider.ExportParameters(true),
            //and a boolean flag specifying no OAEP padding.
            decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);

            //Display the decrypted plaintext to the console. 
            Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData));
        }
        static void Main(string[] args)
        {
            string Msg = "This world is round, not flat, don't believe them!";
            string Password = "secret";
            Program program = new Program();
            string EncryptedString = program.encrypt(Msg);
            string DecryptedString = program.decrypt(EncryptedString);

            //Console.WriteLine("Message: {0}", Msg);
            //Console.WriteLine("Password: {0}", Password);
            //Console.WriteLine("Encrypted string: {0}", EncryptedString);
            //Console.WriteLine("Decrypted string: {0}", DecryptedString);

            program.abc();
            Console.Read();
             
        }
    }
}
